# -*- coding: utf-8 -*-
"""
@Time    : 2024/8/1 14:40 
@Author  : ZhangShenao 
@File    : 3.重定向.py 
@Desc    : 重定向

两种典型的重定向模式:
301:永久重定向,通常是原网站已经不存在了,需要永久转移。典型场景:域名映射
302:临时重定向,通常用于验证失败、访问需要权限的页面进行登录跳转时,属于某些状态下的临时跳转
"""

from flask import Flask, Response, redirect, request, url_for

app = Flask(__name__)
app.config["DEBUG"] = True


@app.route("/", methods=["GET", "POST"])
def index() -> [str | Response]:
    """网站首页视图函数"""

    # 通过url_map函数,可以获取整个Flask下应用所有的url->endpoint映射关系
    print(f"app.url_map: {app.url_map}")

    # 如果用户未登录,则重定向到登录页面
    if request.args.get("TOKEN") is None:
        # 使用url_for方法,可以获取视图函数所对应的url
        # 推荐采用这种方式获取url
        # 因为url可能经常发生改变,但是视图函数基本不会修改
        login_url = url_for("login")
        return redirect(location=login_url, code=302)

    # 用户已登录,直接展示首页
    return "<h1>欢迎回来</h1>"


@app.route("/login", methods=["GET"])
def login() -> [str | Response]:
    """用户登录视图函数"""

    return "<h1>请您登录</h1>"


@app.route("/external_redirect", methods=["GET"])
def external_redirect() -> [str | Response]:
    """站外重定向"""

    # 方式1: 手动创建重定向的Response
    # return Response(status=302, headers={"Location": "https://www.163.com"})

    # 方式2: 通过Flask内置的redirect函数,指定重定向的location个status_code
    resp = redirect(location="https://www.163.com", code=301)
    print(f"response: {resp}")
    return resp


@app.route("/notice", methods=["GET"])
def notice() -> [str | Response]:
    """
    发送通知
    重定向时附带请求参数
    """

    mobile = 13812345678

    # 获取重定向url,并附带请求参数
    url = url_for(endpoint="send_sms", mobile=mobile)

    return redirect(location=url, code=302)


@app.route("/send_sms/<int:mobile>", methods=["GET"])
def send_sms(mobile: int) -> str:
    """发送短信"""

    return f"{mobile}发送短信成功"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
